#include <ESP8266WiFi.h>

const char WiFiAPPSK[] = "sparkfun";

const int LED_PIN = 5; 
const int ANALOG_PIN = A0;
const int DIGITAL_PIN = 12; 

WiFiServer server(80);

void setup() {
    initHardware();
    setupWiFi();
    server.begin();
}

void loop(){
    WiFiClient client = server.available(); 
    if (!client){ //pokud nikdo neni pripojen
        return;
    }

    String req = client.readStringUntil('\r');
    Serial.println(req);
    client.flush();

    int val = -1;
    
    if (req.indexOf("/led/0") != -1){
        val = 0;
    }
    else if (req.indexOf("/led/1") != -1){
        val = 1;
    }
    else if (req.indexOf("/read") != -1){
        val = -2;
    }
    
    if (val >= 0){
        digitalWrite(LED_PIN, val);
    }
    client.flush();

   String s = "HTTP/1.1 200 OK\r\n";
    s += "Content-Type: text/html\r\n\r\n";
    s += "<!DOCTYPE HTML>\r\n<html>\r\n";
    if (val >= 0){
        s += "LED is now ";
        s += (val)?"on":"off";
    }
    else if (val == -2){
        s += "Analog Pin = ";
        s += String(analogRead(ANALOG_PIN));
        s += "<br>";
        s += "Digital Pin 12 = ";
        s += String(digitalRead(DIGITAL_PIN));
    }
    else{
        s += "Invalid Request.<br> Try /led/1, /led/0, or /read.";
    }
    s += "</html>\n";

    client.print(s);
    delay(1);
    Serial.println("Client disonnected");
}

void setupWiFi(){
    WiFi.mode(WIFI_AP);

    uint8_t mac[WL_MAC_ADDR_LENGTH];
    WiFi.softAPmacAddress(mac);
    String macID = String(mac[WL_MAC_ADDR_LENGTH - 2], HEX) + String(mac[WL_MAC_ADDR_LENGTH - 1], HEX);
    macID.toUpperCase();
    String AP_NameString = "ESP8266 Thing " + macID;

    char AP_NameChar[AP_NameString.length() + 1];
    memset(AP_NameChar, 0, AP_NameString.length() + 1);

    for (int i=0; i<AP_NameString.length(); i++){
        AP_NameChar[i] = AP_NameString.charAt(i);
    }

    WiFi.softAP(AP_NameChar, WiFiAPPSK);
}

void initHardware(){
    Serial.begin(115200);
    pinMode(DIGITAL_PIN, INPUT_PULLUP);
    pinMode(LED_PIN, OUTPUT);
    digitalWrite(LED_PIN, LOW);
}